'''
自定义迭代器：即要实现__iter__(),__next__()。
'''

class MyIterator(object):
    '''
    自定义的迭代器: 必须实现 __iter__() 和 __next__()。
    计算Fibonacci数列：[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...]
    '''
    def __init__(self, fibo_nums, front_num, next_num):
        self.fibo_nums = fibo_nums  # Fibonacci数列成员的数量
        self.front_num = front_num  # 两个数中的前一个数
        self.next_num = next_num  # 两个数中的后一个数
        self.count = 0  # 计数器，打到某个值时退出

    def __iter__(self):
        return self  # 返回自身的引用，会自动调用__next__

    def __next__(self):
        if self.count < self.fibo_nums:
            ret = self.front_num
            # 核心算法：后一个数是前两个数的和。
            self.front_num, self.next_num = self.next_num, self.front_num+self.next_num
            self.count += 1
            return ret
        else:
            raise StopIteration  # 通过抛出异常来结束Iterator | 不写此异常，会一直输出None
    

if __name__ == "__main__":
    my_iterator = MyIterator(10, 0, 1)
    for mi in my_iterator:
        print('==>> fibo: ', mi)